/*
 * 版权所有 (C) 2018 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
 */
package net.redxyz.repost.service.task.user;

import java.util.List;

import net.redxyz.repost.service.dao.SyncDao;
import net.redxyz.top.dbo.user.User;
import net.redxyz.top.dbo.user.UserError;
import net.redxyz.top.dbo.user.UserGift;

import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.schedule.Task;
import org.zhiqim.kernel.util.DateTimes;
import org.zhiqim.orm.ORM;
import org.zhiqim.orm.dbo.Selector;

/**
 * 用户清理任务
 *
 * @version v1.0.0 @author zouzhigang 2014-3-20 新建与整理
 */
public class UserCleanupTask implements Task
{
    private static final Log log = LogFactory.getLog(UserCleanupTask.class);

    public void execute()
    {
        // 1.清理7天到期用户
        doCleanupUser();
    }

    /** 清除到期7天的用户 */
    private void doCleanupUser()
    {
        log.info("清理7天前到期用户开始...");
        String date = DateTimes.getPreviousDateString(7);

        try
        {// 删除操作日志
            Selector selector = new Selector();
            selector.addMaybe("userStatus", 1);
            selector.addMaybeThenLE("endDate", date);
            selector.addFields("nick,userDb,userDomain,userId");

            List<User> userList = ORM.table().list(User.class, selector);
            for (User user : userList)
            {
                process(user);
            }

            log.info("清理7天前到期用户结束，共" + userList.size() + "个...");
        }
        catch (Exception e)
        {
            log.error("清理7天前到期用户异常", e);
        }
    }
    
    /**
     * 清理用户数据
     * 
     * @param user
     * @throws Exception
     */
    private void process(User user) throws Exception
    {
        String nick = user.getNick();

        // 再次关闭同步服务
        SyncDao.doCloseSync(nick);

        Selector sel = new Selector();
        sel.addMust("nick", nick);

        // 删除系统表
        ORM.table().delete(UserGift.class, sel);
        ORM.table().delete(UserError.class, sel);


        // 最后删除用户表
        ORM.table().delete(User.class, nick);

        log.info("用户[" + nick + "]数据删除完成。");
    }
}
